<!!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			var str = "var num = 1;";
			var str1 = "var num = 1;";
			var result = eval(str);
			console.log(result);	// => undefined
			
			str = str + "";
			
			
			var func = function(){
				var innum;
				eval("innum = 1;")
				return innum;
			}
			console.log(func());// => 1
			
			var func1 = function(){
				var innum = null;
				var innum2 = eval("var innum;innum = 1;")
				return innum2;
			}
			console.log(func1());// => 1
			
			var func2 = function(){
				var innum2 = eval("var str = null");
				eval("str1 = 'OK'");
				return innum2;
			}
			func2();
			console.log(str);// => var num = 1;
			console.log(str1);// => OK
			
			
			/* 当eval()被赋予别名 */
			/* 重点：
				当eval()被赋予别名时，javascript解释器对eval()和对其赋予别名的函数，执行优化效果不同 
				即，其作用域不同*/
			var geval=eval;                //使用别名调用evla将是全局eval
			var x="global",y="global",n="global";    //两个全局变量
			function f(){                //函数内执行的是局部eval
				var x="local";            //定义局部变量
				eval("x += ' chenged';");//直接使用eval改变的局部变量的值
										//此时的x为局部变量的x,且改变的变量是局部变量
				/* 相当于
				 x = x + ' changed';//*/
				return x;                //返回更改后的局部变量
			}
			
			
			function g(){                //这个函数内执行了全局eval
				var y="local";
				geval("y += ' changed';"); //直接调用改变了全局变量的值
											//此处javascript解释器对其做的优化和普通函数的效果相同在其函数声明的作用域下
				/* 相当于
				 y = y + ' changed';//此处的y为全局变量的y，即y = global
									//其改变的时*/
				return y;//此处的y为局部变量y,在函数内,局部变量和全局变量重名,
			}//赋予eavl别名的函数和以下写法效果相同
			
			
			function h(){
				n += ' changed';
			}
			function m(){
				var n="local";
				h();
				return n;
			}
			
			console.log(f(),'x:'+x);            //改变了布局变了，输出	  “local changed x:global”
			console.log(g(),'y:'+y);            //改变了全局变量，输出   “local y:global changed”
			console.log(m(),'m:'+n);            //改变了全局变量，输出   “local m:global changed”
			console.log(f());            //改变了布局变了，输出 	“local changed”
			console.log(g());            //改变了全局变量，输出   “local”
			console.log(m());            //改变了全局变量，输出   “local”
// 			console.log(x);            //改变了布局变了，输出   “global”
// 			console.log(y);            //改变了全局变量，输出   “global changed changed”
			
			
			/* 归纳：作用：我们可以通过赋予eavl别名来控制，其执行表达式的作用域 */
			
			function aa(){
				var b = function(){
					alert(1);
				};
				eval = b;
				eval();
			}
			aa();
		</script>
	</body>
</html>